<?php

declare(strict_types=1);

namespace app\model;

use think\db\Query;
use think\facade\Db;
use function foo\func;

/**
 * 
 *
 * @mixin \think\Model
 * @property int $id 自增id
 * @property string $username 用户名
 * @property string $password 登录密码
 * @property string $avatar 头像
 * @property string $mobile 手机号
 * @property int $balance 账户余额。单位：分
 * @property int $profit_balance 待提佣金
 * @property int $withdraw_amount 累计提现金额。单位：分
 * @property string $company_name 公司名称
 * @property string $app_key App Key
 * @property string $app_secret App Secret
 * @property int $status 状态：1启用 2禁用
 * @property bool $oil_service 是否开启加油服务：0否 1是
 * @property float $mobile_discount_slow 话费慢充结算折扣
 * @property float $mobile_discount_fast 话费快充结算折扣
 * @property string $email 邮箱
 * @property int $settle_type 结算方式：1返佣 2预付
 * @property int $is_deleted 是否删除：0否 1是
 * @property string $created_at 创建时间
 * @property string $updated_at 更新时间
 * @property int $recharge_amount 累计充值。单位：分
 * @property int $mobile_service 是否开启话费服务：0否 1是
 * @property string $ip_address IP白名单，不填无限制。多个英文逗号隔开
 * @property string $alipay 支付宝账号
 * @property string $weixin 微信号
 * @property string $ali_real_name 支付宝真实姓名
 * @property bool $corder_show 用户端订单是否显示1不显示 2显示
 * @property int $total_profit 累计佣金。单位：分
 * @property string $balance_last_updated_at 资金明细最后更新时间
 * @property-read \app\model\AgentServiceConfig[] $service_config
 * @property-read \app\model\AgentMobileSupplier[] $mobile_supplier
 * @property-read \app\model\AgentSupplier[] $supplier
 * @property-read \app\model\AgentBalanceLog[] $balance_log
 * @property-read \app\model\AgentSalesman[] $agent_salesman
 * @property int $freeze_amount 冻结金额。单位：分【代理商发起预付充值申请的时候，如果金额为负数时用此字段】
 * @property string $mobile_supplier_ids 话费供应商轮询通道【保存话费供应商id】
 * @property int $app_id 第三方应用
 * @property int $merchant_id 第三方商户号
 * @property bool $is_relation 关联有美(1:关联,0:不关联)
 * @property-read \app\model\AgentExtend $agent_extend
 * @property-read \app\model\CouponConfig $coupon_config
 * @property-read \app\model\AgentConfig $agent_config
 * @property int $link_type 是否展示快站链接1：快站2：惠充
 * @property int $is_short_chain 是否支持自定义链接 1支持 2不支持
 * @property string $security_tag 账户加密字符
 */
class Agent extends CommonModel
{
    public static $settleType = [
        SETTLE_TYPE_PROFIT => '返佣',
        SETTLE_TYPE_PREPAY => '预付',
    ];


    const LINK_TYPE_KUAIZHAN = 1; //快站
    const LINK_TYPE_SELF = 2; //自己的域名


    const IS_DELETE_FALSE = 0;

    const IS_RELATION_YES = 1;
    const IS_RELATION_NO = 0;

    const STATUS_ACTIVE = 1;
    const STATUS_CLOSE  = 2;

    //是否支持自定义链接
    const IS_SHORT_CHAIN_YES = 1; //支持
    const IS_SHORT_CHAIN_NO = 2;  //不支持

    public static $withSearch = ['company_name'];

    /*
     关联删除
     1，删除代理商业务配置
     2，删除代理配置的供应商
    */
    public static function onAfterDelete($model)
    {
        // step 删除代理商业务配置
        AgentServiceConfig::destroy(AgentServiceConfig::where('agent_id', $model->id)->column('id'));
        // step 删除代理配置的供应商
        AgentMobileSupplier::where('agent_id', $model->id)->delete();
    }

    public static function onAfterCreate($agent)
    {
        // 初始 代理商日报
        (new AgentFinanceDaily())->initDaily($agent->id);
    }

    /*
     业务配置
    */
    public function serviceConfig()
    {
        return $this->hasMany(AgentServiceConfig::class, 'agent_id');
    }

    /*
     供应商列表 == 目前只有话费才有设置
    */
    public function mobileSupplier()
    {
        return $this->hasMany(AgentMobileSupplier::class, 'agent_id');
    }

    /*
     其他来自base_supplier 的供应商
    */
    public function supplier()
    {
        return $this->hasMany(AgentSupplier::class, 'agent_id');
    }

    /*
     资金记录
    */
    public function balanceLog()
    {
        return $this->hasMany(AgentBalanceLog::class, 'agent_id');
    }

    /*
     * 代理商和业务员关联表
     */
    public function agentSalesman()
    {
        return $this->hasMany(AgentSalesman::class, 'agent_id');
    }

    /**
     * 代理扩展信息
     */
    public function agentExtend()
    {
        return $this->hasOne(AgentExtend::class, 'agent_id', 'id');
    }

    /**
     * 搜索公司名称
     */
    public function searchCompanyNameAttr($query, $value, $params)
    {
        $companyName = $params['company_name'] ?? '';

        if (!$companyName) return;
        /**
         * @var Query $query
         */
        $query->whereLike('company_name', "%$companyName%");

//        $query->whereLike('username', "%$companyName%");  //这个需要Orwhere 注意
    }

    public function couponConfig()
    {
        return $this->hasOne(CouponConfig::class, 'agent_id', 'id');
    }

    public function agentConfig()
    {
        return $this->hasOne(AgentConfig::class, 'agent_id', 'id');
    }

    public function getAgentTempList($company_name, $mould)
    {
        $agent_ids = array();
        if (in_array($mould, [1, 2])) {
            $agent_ids = AgentConfig::query()->where('mould', AgentConfig::MOULD_ZDY)->column('agent_id');
        }
        $list = self::where('status', self::STATUS_ACTIVE)
            ->when($agent_ids, function ($query) use ($agent_ids, $mould) {
                if ($mould == 2) { //使用默认
                    $query->whereNotIn('id', $agent_ids);
                } else {  //使用自定义
                    $query->whereIn('id', $agent_ids);
                }
            })->when($company_name, function ($query) use ($company_name) {
                $query->where('company_name|username', 'like', '%' . $company_name . '%');
            })->with(['coupon_config' => function ($query) {
                $query->where('global', CouponConfig::GLOBAL_PTDLQJ)->withoutField('id, quote_id, status, created_at, deleted_at');
            }, 'agentConfig' => function ($query) {
                $query->withField('id,agent_id,mould');
            }])->order('created_at', 'desc')->field('id, username, company_name, mobile')
            ->paginate()
            ->toArray();
        return $list;
    }

    //查询一定条件的代理是否存在
    public static function checkExists($map)
    {
        $info = self::where($map)->findOrEmpty();
        if ($info->isEmpty()) {
            return false;
        }
        return true;
    }

}
